다이나믹 프로그래밍 [C/C++] 백준(BOJ) 1149 RGB거리 문제에서 i번째 집과 i-1번째 집은 색이 달라야 한다고 주어졌다. 또한 모든 집을 칠하는데 드는 비용의 최솟값을 구해야하므로 i번째 집까지의 최소 비용을 dp배열에 갱신하면서 진행해 N번째 집의 최소 비용을 구할 것이다. 하지만 이 때 처음에 어떤 집을 칠했는 지는 3가지 경우의 수(R,G,B)를 모두 고려해야하므로 dp배열을 dp[N][3]과 같이 선언하여 최솟값을 갱신하면 된다! 그 후... 다이나믹 프로그래밍백준CC [C/C++] 백준(BOJ) 1463 1로 만들기 문제에서는 3가지 연산을 사용하여 주어진 정수 N을 1로 만드는 연산의 횟수의 최솟값을 구해야 한다. 하지만 각각의 수 별로 최솟값이 되는 방식은 갖가지이므로 우리는 N 전까지의 모든 수들의 1로 만드는 연산의 최솟값을 dp배열에 연산 횟수를 갱신하면서 올라가 N의 최소 연산 횟수를 구해야 한다. 시간복잡도는 N이고, N은 1,000,000까지므로 시간제한인 0.15초안에 충분히 들어온다. ... 다이나믹 프로그래밍백준CC [C/C++] 백준(BOJ) 1932 정수 삼각형 구하는 것은 정수 삼각형에서 합이 최대가 되는 경로이다. 필자는 경로를 구성할 때 아래에서 위로 올라오면서 각 구간에서의 합의 최댓값을 갱신하는 방법을 사용했다. 한번 방문한 지점은 다시 갱신될 필요가 없기 때문에 dp에 값이 존재할 때는 해당 dp값을 반환해주고 재귀랑 dp를 사용해 dp[x][y] = max(triangle(x + 1, y), triangle(x + 1, y + 1)) +... 다이나믹 프로그래밍백준CC [백준] #1463 - 1로 만들기 BFS를 사용하여 풀었다. 문제를 풀고나니 다이나믹 프로그래밍으로 분류되어 있길래 다이나믹 프로그래밍을 이용해서 다시 풀어봤다. BFS로 구할 때는 n부터 계산했는데, DP로 구할 때는 1부터 계산했다. 채점 결과, 위의 BFS를 이용한 코드가 아래 DP를 이용한 코드보다 더 빠르다. DP를 이용한 코드는 모든 경우를 비교하며 계산해서 더 오래 걸리는 것 같다.... 백준다이나믹 프로그래밍알고리즘다이나믹 프로그래밍 [백준/c++] 9095번 : 1,2,3 더하기 문제 링크- 6번째까지 직접 써보면서 규칙을 찾아보았다. 4번째 부터 f(n)=f(n-1)+f(n-2)+f(n-3) 규칙이 성립함을 찾았다. 각 테스트케이스 마다 n을 입력받고 ,func(n)에 해당하는 값을 리턴받아 출력 하였다. 이때, 이전 테스트케이스에서 이미 구한값이면 바로 리턴될 수 있도록 정답 배열인 answer[i]에 값이 들어와 있으면 건너뛰도록 하였다. 이 방식은 어쩌다 우연... 재귀다이나믹 프로그래밍다이나믹 프로그래밍 코테 2021 - 6강 (다이나믹 프로그래밍) 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결 가능 그럼 어떻게 시간 복잡도를 줄 일 수 있을 까? 시간 복잡도를 O(N)까지 줄일 수 있다. 보텀업(DP 테이블) 먼저 그리디, 구현, 완전 탐색 등 아이디어로 풀 수 있는지 확인 일단 재귀 함수로 비효율적인 완전 탐색 프로그램을 작성한 뒤에 (탑다운) 작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 ... 다이나믹 프로그래밍다이나믹 프로그래밍 백준 문제 풀이 - 다리 놓기1010번 재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 ... 수학조합론다이나믹 프로그래밍다이나믹 프로그래밍 [알고스팟] 폴리오미노 n=1인 사각형에 하나씩 추가해가면서 경우의 수를 더해가는 문제라고 생각을 했다. 어디다 붙일지에 대한 방법도 매번 달라져서 더 복잡해진다. 책을 보면 위에서부터 한줄 한줄 세어 간다. 각 줄이 세로로 붙어있으면 된다. 나는 남은 사각형의 개수와 현재 줄에 세로로 쌓으려는 사각형의 개수만 알면 된다. 이전의 과정을 보지 않는 것이다. 바로 다음 파란색이다. 현재 남은 블록을 n, 이번 세로줄... 다이나믹 프로그래밍알고리즘알고스팟다이나믹 프로그래밍 백준 11727 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 예제 입력 1 예제 출력 1 예제 입력 2 예제 출력 2 예제 입력 3 예제 출... python알고리즘다이나믹 프로그래밍백준python Algorithm/programmers/다이나믹 프로그래밍/level2/ 가장 큰 정사각형 찾기(with python) board의 최대 크기가 1000 x 1000이기 때문에 완전 탐색으로 했다가는 시간초과가 난다. 따라서 다이나믹 프로그래밍으로 문제를 푼다. 만약 주어진 board의 행이나 열의 길이가 2 미만인 경우에는 board에 1이 있는지 확인한다. 1이 있다면 가장 큰 정사각형의 크기는 1이므로 1을 리턴하고, 없다면 정사각형이 존재하지 않으므로 0을 리턴한다. board의 (1,1)부터 시작하여... 알고리즘 문제programmers다이나믹 프로그래밍programmers 백준 16194 / 카드 구매하기 2 설명 카드 N개를 구매해야한다. 카드팩은 총 N가지 종류가 존재한다. i번째 카드팩은 i개의 카드를 담고있고, 가격은 P[i]원 이다. 카드 N개를 구매하는 비용의 최대값을 구하는 문제 D[i] = 카드i개 구매하는 최대 비용 카드 i개를 구매하는 방법은? 카드 1개가 들어있는 카드팩을 구매하고, 카드 i-1개를 구매 • P[1] + D[i-1] 카드 2개가 들어있는 카드팩을 구매하고, 카드... 백준다이나믹 프로그래밍다이나믹 프로그래밍 [백준] 9465번 스티커 2행 N열 보드가 주어진다 스티커마다 점수가 주어진다 한 스티커를 선택하면 인접한 스티커는 선택할 수 없다 점수의 최댓값 출력 dp[0][0], dp[1][0], dp[0][1], ... 순서로 돌면서 점수 계산 어차피 위, 아래는 동시에 선택할 수 없기 때문에 나누어 생각한다 해당 좌표까지의 최댓값 저장 위쪽일 때 해당 좌표를 선택할 경우 왼쪽, 아래쪽은 선택할 수 없기 때문에 (왼쪽아래 ... 백준파이썬알고리즘다이나믹 프로그래밍다이나믹 프로그래밍 [백준] 9251번 : LCS (python 파이썬) 백준다이나믹 프로그래밍문자열다이나믹 프로그래밍 [백준] 2096번 내려가기 3 x n board에서 내려가면서 최댓값, 최솟값 구하기 접근 처음에 간단한 DP라고 생각했다 난관1 그대로 구현하니 메모리 초과가 났다 살짝 멘붕올뻔 했지만 마음을 가다듬고 생각해봤다 처음에 n x 3이 아니라 n x 1 크기로 만들어볼까 했지만 이전 경로도 알아야 되기 때문에 그건 안 된다는걸 알았다 해결 DP 리스트를 생각해보니 바로 이전 값들만 참조하면 되기 때문에 굳이 n개만큼 만... 다이나믹 프로그래밍다이나믹 프로그래밍 [백준] 10942번 팰린드롬? 2000개 숫자가 주어짐 100만개 start, end 인덱스가 주어짐 start ~ end 가 팰린드롬이면 1, 아니면 0 출력 dp 배열을 놓는다 dp[s][e] : s~e가 팰린드롬이면 1, 아니면 0 양 끝이 같고 사이가 팰린드롬이면 1 bottom-up으로 순회 즉, 사이가 bottom 숫자가 2000개라 O(N^2) 가능... 다이나믹 프로그래밍다이나믹 프로그래밍 백준 ) 합분해 0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오. 덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다. 첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다. 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.... 다이나믹 프로그래밍다이나믹 프로그래밍 <BOJ>11726번: 2xn 타일링 1x2, 2x1 타일로 직사각형을 직접 채워보면 일정한 패턴이 반복된다. 결론적으로 피보나치 수열과 같은 꼴의 점화식을 도출하게 된다.... Java백준boj다이나믹 프로그래밍DPDP [프로그래머스] 풍선 터트리기 서로 다른 숫자 리스트가 주어짐 임의의 인접한 숫자 중 큰 숫자만 지울 수 있음 한 번만 작은 숫자를 지울 수 있음 마지막으로 남길 수 있는 숫자의 개수 리턴 모든 숫자를 돌면서 왼쪽의 큰 숫자들을 모두 제거 오른쪽의 큰 숫자들을 모두 제거 왼쪽 < 가운데 > 오른쪽이면 불가능 나머지 가능 O(N^2) 이라 시간 초과 어차피 모두 서로 다른 수이기 때문에 모두 제거 가능 모두 제거하면 최솟값... 다이나믹 프로그래밍프로그래머스다이나믹 프로그래밍 1103. 게임 기존의 그래프 문제와 다르게, visited와 cycle 두개의 확인 지표가 필요하다. 처음에는 기존의 maze 문제처럼 BFS로 풀려고했다. 왔던 타일을 다시 오는 경우가 발생할 수 있기 때문에 BFS로 풀 수 없다는 것을 알게되었다. DFS로 변경했더니, visited를 설정해 줄 수 없어서 recursion 횟수가 급증했다. visited 배열을 DP로 활용하고, 무한번 왔다갔다 하는것... 백트래킹다이나믹 프로그래밍다이나믹 프로그래밍 백준 ) 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로... 다이나믹 프로그래밍다이나믹 프로그래밍 [Java] LeetCode - Counting Bits 다이나믹 프로그래밍다이나믹 프로그래밍
[C/C++] 백준(BOJ) 1149 RGB거리 문제에서 i번째 집과 i-1번째 집은 색이 달라야 한다고 주어졌다. 또한 모든 집을 칠하는데 드는 비용의 최솟값을 구해야하므로 i번째 집까지의 최소 비용을 dp배열에 갱신하면서 진행해 N번째 집의 최소 비용을 구할 것이다. 하지만 이 때 처음에 어떤 집을 칠했는 지는 3가지 경우의 수(R,G,B)를 모두 고려해야하므로 dp배열을 dp[N][3]과 같이 선언하여 최솟값을 갱신하면 된다! 그 후... 다이나믹 프로그래밍백준CC [C/C++] 백준(BOJ) 1463 1로 만들기 문제에서는 3가지 연산을 사용하여 주어진 정수 N을 1로 만드는 연산의 횟수의 최솟값을 구해야 한다. 하지만 각각의 수 별로 최솟값이 되는 방식은 갖가지이므로 우리는 N 전까지의 모든 수들의 1로 만드는 연산의 최솟값을 dp배열에 연산 횟수를 갱신하면서 올라가 N의 최소 연산 횟수를 구해야 한다. 시간복잡도는 N이고, N은 1,000,000까지므로 시간제한인 0.15초안에 충분히 들어온다. ... 다이나믹 프로그래밍백준CC [C/C++] 백준(BOJ) 1932 정수 삼각형 구하는 것은 정수 삼각형에서 합이 최대가 되는 경로이다. 필자는 경로를 구성할 때 아래에서 위로 올라오면서 각 구간에서의 합의 최댓값을 갱신하는 방법을 사용했다. 한번 방문한 지점은 다시 갱신될 필요가 없기 때문에 dp에 값이 존재할 때는 해당 dp값을 반환해주고 재귀랑 dp를 사용해 dp[x][y] = max(triangle(x + 1, y), triangle(x + 1, y + 1)) +... 다이나믹 프로그래밍백준CC [백준] #1463 - 1로 만들기 BFS를 사용하여 풀었다. 문제를 풀고나니 다이나믹 프로그래밍으로 분류되어 있길래 다이나믹 프로그래밍을 이용해서 다시 풀어봤다. BFS로 구할 때는 n부터 계산했는데, DP로 구할 때는 1부터 계산했다. 채점 결과, 위의 BFS를 이용한 코드가 아래 DP를 이용한 코드보다 더 빠르다. DP를 이용한 코드는 모든 경우를 비교하며 계산해서 더 오래 걸리는 것 같다.... 백준다이나믹 프로그래밍알고리즘다이나믹 프로그래밍 [백준/c++] 9095번 : 1,2,3 더하기 문제 링크- 6번째까지 직접 써보면서 규칙을 찾아보았다. 4번째 부터 f(n)=f(n-1)+f(n-2)+f(n-3) 규칙이 성립함을 찾았다. 각 테스트케이스 마다 n을 입력받고 ,func(n)에 해당하는 값을 리턴받아 출력 하였다. 이때, 이전 테스트케이스에서 이미 구한값이면 바로 리턴될 수 있도록 정답 배열인 answer[i]에 값이 들어와 있으면 건너뛰도록 하였다. 이 방식은 어쩌다 우연... 재귀다이나믹 프로그래밍다이나믹 프로그래밍 코테 2021 - 6강 (다이나믹 프로그래밍) 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결 가능 그럼 어떻게 시간 복잡도를 줄 일 수 있을 까? 시간 복잡도를 O(N)까지 줄일 수 있다. 보텀업(DP 테이블) 먼저 그리디, 구현, 완전 탐색 등 아이디어로 풀 수 있는지 확인 일단 재귀 함수로 비효율적인 완전 탐색 프로그램을 작성한 뒤에 (탑다운) 작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 ... 다이나믹 프로그래밍다이나믹 프로그래밍 백준 문제 풀이 - 다리 놓기1010번 재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 ... 수학조합론다이나믹 프로그래밍다이나믹 프로그래밍 [알고스팟] 폴리오미노 n=1인 사각형에 하나씩 추가해가면서 경우의 수를 더해가는 문제라고 생각을 했다. 어디다 붙일지에 대한 방법도 매번 달라져서 더 복잡해진다. 책을 보면 위에서부터 한줄 한줄 세어 간다. 각 줄이 세로로 붙어있으면 된다. 나는 남은 사각형의 개수와 현재 줄에 세로로 쌓으려는 사각형의 개수만 알면 된다. 이전의 과정을 보지 않는 것이다. 바로 다음 파란색이다. 현재 남은 블록을 n, 이번 세로줄... 다이나믹 프로그래밍알고리즘알고스팟다이나믹 프로그래밍 백준 11727 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 예제 입력 1 예제 출력 1 예제 입력 2 예제 출력 2 예제 입력 3 예제 출... python알고리즘다이나믹 프로그래밍백준python Algorithm/programmers/다이나믹 프로그래밍/level2/ 가장 큰 정사각형 찾기(with python) board의 최대 크기가 1000 x 1000이기 때문에 완전 탐색으로 했다가는 시간초과가 난다. 따라서 다이나믹 프로그래밍으로 문제를 푼다. 만약 주어진 board의 행이나 열의 길이가 2 미만인 경우에는 board에 1이 있는지 확인한다. 1이 있다면 가장 큰 정사각형의 크기는 1이므로 1을 리턴하고, 없다면 정사각형이 존재하지 않으므로 0을 리턴한다. board의 (1,1)부터 시작하여... 알고리즘 문제programmers다이나믹 프로그래밍programmers 백준 16194 / 카드 구매하기 2 설명 카드 N개를 구매해야한다. 카드팩은 총 N가지 종류가 존재한다. i번째 카드팩은 i개의 카드를 담고있고, 가격은 P[i]원 이다. 카드 N개를 구매하는 비용의 최대값을 구하는 문제 D[i] = 카드i개 구매하는 최대 비용 카드 i개를 구매하는 방법은? 카드 1개가 들어있는 카드팩을 구매하고, 카드 i-1개를 구매 • P[1] + D[i-1] 카드 2개가 들어있는 카드팩을 구매하고, 카드... 백준다이나믹 프로그래밍다이나믹 프로그래밍 [백준] 9465번 스티커 2행 N열 보드가 주어진다 스티커마다 점수가 주어진다 한 스티커를 선택하면 인접한 스티커는 선택할 수 없다 점수의 최댓값 출력 dp[0][0], dp[1][0], dp[0][1], ... 순서로 돌면서 점수 계산 어차피 위, 아래는 동시에 선택할 수 없기 때문에 나누어 생각한다 해당 좌표까지의 최댓값 저장 위쪽일 때 해당 좌표를 선택할 경우 왼쪽, 아래쪽은 선택할 수 없기 때문에 (왼쪽아래 ... 백준파이썬알고리즘다이나믹 프로그래밍다이나믹 프로그래밍 [백준] 9251번 : LCS (python 파이썬) 백준다이나믹 프로그래밍문자열다이나믹 프로그래밍 [백준] 2096번 내려가기 3 x n board에서 내려가면서 최댓값, 최솟값 구하기 접근 처음에 간단한 DP라고 생각했다 난관1 그대로 구현하니 메모리 초과가 났다 살짝 멘붕올뻔 했지만 마음을 가다듬고 생각해봤다 처음에 n x 3이 아니라 n x 1 크기로 만들어볼까 했지만 이전 경로도 알아야 되기 때문에 그건 안 된다는걸 알았다 해결 DP 리스트를 생각해보니 바로 이전 값들만 참조하면 되기 때문에 굳이 n개만큼 만... 다이나믹 프로그래밍다이나믹 프로그래밍 [백준] 10942번 팰린드롬? 2000개 숫자가 주어짐 100만개 start, end 인덱스가 주어짐 start ~ end 가 팰린드롬이면 1, 아니면 0 출력 dp 배열을 놓는다 dp[s][e] : s~e가 팰린드롬이면 1, 아니면 0 양 끝이 같고 사이가 팰린드롬이면 1 bottom-up으로 순회 즉, 사이가 bottom 숫자가 2000개라 O(N^2) 가능... 다이나믹 프로그래밍다이나믹 프로그래밍 백준 ) 합분해 0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오. 덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다. 첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다. 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.... 다이나믹 프로그래밍다이나믹 프로그래밍 <BOJ>11726번: 2xn 타일링 1x2, 2x1 타일로 직사각형을 직접 채워보면 일정한 패턴이 반복된다. 결론적으로 피보나치 수열과 같은 꼴의 점화식을 도출하게 된다.... Java백준boj다이나믹 프로그래밍DPDP [프로그래머스] 풍선 터트리기 서로 다른 숫자 리스트가 주어짐 임의의 인접한 숫자 중 큰 숫자만 지울 수 있음 한 번만 작은 숫자를 지울 수 있음 마지막으로 남길 수 있는 숫자의 개수 리턴 모든 숫자를 돌면서 왼쪽의 큰 숫자들을 모두 제거 오른쪽의 큰 숫자들을 모두 제거 왼쪽 < 가운데 > 오른쪽이면 불가능 나머지 가능 O(N^2) 이라 시간 초과 어차피 모두 서로 다른 수이기 때문에 모두 제거 가능 모두 제거하면 최솟값... 다이나믹 프로그래밍프로그래머스다이나믹 프로그래밍 1103. 게임 기존의 그래프 문제와 다르게, visited와 cycle 두개의 확인 지표가 필요하다. 처음에는 기존의 maze 문제처럼 BFS로 풀려고했다. 왔던 타일을 다시 오는 경우가 발생할 수 있기 때문에 BFS로 풀 수 없다는 것을 알게되었다. DFS로 변경했더니, visited를 설정해 줄 수 없어서 recursion 횟수가 급증했다. visited 배열을 DP로 활용하고, 무한번 왔다갔다 하는것... 백트래킹다이나믹 프로그래밍다이나믹 프로그래밍 백준 ) 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로... 다이나믹 프로그래밍다이나믹 프로그래밍 [Java] LeetCode - Counting Bits 다이나믹 프로그래밍다이나믹 프로그래밍